﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IObject.h"
#include "IExternalObject.h"
#include "GcmpModelInterface.h"
#include "ElementCreationOptions.h"


namespace gcmp
{
    class ILineTypeData;
    class IDocument;

    /// \brief 线型元素
    /// \brief 可根据已有的ILineTypeData创建线型元素加入到文档中（同一个文档中名称不得重复）；可从文档中根据名称索引线型
    class GCMP_MODEL_INTERFACE_EXPORT ILineTypeNew : public IExternalObject
    {
        DEFINE_CAST_DERIVED(gcmp::ILineTypeNew, gcmp::IExternalObject);
    public:

        /// \brief 在文档中创建线型元素
        /// \param pDocument 当前文档
        /// \param pLineType 线型
        /// \param overrideIfNameRepeat 如果线型与文档中已有线型重名，是否要覆盖
        /// \return 线型元素
        static ILineTypeNew* Create(IDocument* pDocument, OwnerPtr<ILineTypeData> pLineType, bool overrideIfNameRepeat, ElementCreationOptions eco = ElementCreationOptions::Normal);

        /// \brief 在文档中创建线型元素
        /// \param pDocument 当前文档
        /// \param pLineType 线型
        /// \return 线型元素
        GCMP_OBSOLETE_API(2021/04/01, ILineTypeNew::Create(IDocument*,OwnerPtr<ILineTypeData>,bool)) static ILineTypeNew* Create(IDocument* pDocument, OwnerPtr<ILineTypeData> pLineType);

        /// \brief 通过线型名称得到线型
        /// \param pDocument 当前文档
        /// \param lineTypeName 线型名称
        /// \return 线型元素
        static ILineTypeNew* GetLineTypeByName(const IDocument* pDocument, const std::wstring& lineTypeName);

        /// \brief 得到所有线型
        /// \param pDocument 当前文档
        /// \return 文档所有线型
        static std::vector<ILineTypeNew*> GetAllLineTypes(const IDocument* pDocument);
        
        /// \brief 获取线型
        /// \return 线型
        virtual const ILineTypeData* GetLineTypeData() const = 0;

        /// \brief 设置线型数据
        /// \param opLineTypeData 线型数据
        /// \return 成功返回true，失败返回false（名称为空或与文档中其它线型元素重名）
        virtual bool SetLineTypeData(OwnerPtr<ILineTypeData> opLineTypeData) = 0;
    };
}

